package edu.pku.sei.autounit.reflect;

import java.util.ArrayList;
import java.util.List;

public abstract class AbstractMethod implements Method{
	protected int mod;
	private Class declaringClass;
	private String name;
	
	protected TypeParameter [] typeParameters;
	
	public AbstractMethod(int mod,Class declaringClass,String name){
		this.mod = mod;
		this.declaringClass = declaringClass;
		this.name = name;
	}
	
	public AbstractMethod(Class declaringClass,String name){
		this.declaringClass = declaringClass;
		this.name = name;
	}
	
	public boolean isAbstract() {
		return java.lang.reflect.Modifier.isAbstract(mod);
	}

	
	public boolean isFinal() {
		return java.lang.reflect.Modifier.isFinal(mod);
	}

	
	public boolean isInterface() {
		return java.lang.reflect.Modifier.isInterface(mod);
	}

	
	public boolean isNative() {
		return java.lang.reflect.Modifier.isNative(mod);
	}

	
	public boolean isPrivate() {
		return java.lang.reflect.Modifier.isPrivate(mod);
	}

	
	public boolean isProtected() {
		return java.lang.reflect.Modifier.isProtected(mod);
	}

	
	public boolean isPublic() {
		return java.lang.reflect.Modifier.isPublic(mod);
	}

	
	public boolean isStatic() {
		return java.lang.reflect.Modifier.isStatic(mod);
	}

	
	public boolean isStrictfp() {
		return java.lang.reflect.Modifier.isStrict(mod);
	}

	
	public boolean isSynchronized() {
		return java.lang.reflect.Modifier.isSynchronized(mod);
	}

	
	public boolean isTransient() {
		return java.lang.reflect.Modifier.isTransient(mod);
	}

	
	public boolean isVolatile() {
		return java.lang.reflect.Modifier.isVolatile(mod);
	}

	
	final public Type[] getContexts() {
		List<Type> list = new ArrayList<Type>();
		for(TypeParameter tpyeParameter : typeParameters){
			if(tpyeParameter != null)
				list.add(tpyeParameter.getContext());
		}
		return list.toArray(new Type[list.size()]);
	}

	
	final public TypeParameter getTypeParameter(String name) {
		TypeParameter p = this.getDeclaringClass().getTypeParameter(name);
		if(p != null)
			return p;
		for(TypeParameter t:typeParameters){
			if(t!=null&&t.getName().equals(name))
				return t;
		}
		return null;
	}

	
	final public Class getDeclaringClass() {
		return declaringClass;
	}

	
	final public String getName() {
		return name;
	}
}
